package cc.md888.app.application.option;

import cc.md888.app.domain.entity.Option;
import cc.md888.app.exception.BizRuntimeException;
import cc.md888.app.infr.config.MutableConfigService;
import cc.md888.app.infr.dao.OptionDao;
import cc.md888.app.model.option.*;
import cc.md888.app.utils.BeanCopyUtils;
import cc.md888.dto.PageQuery;
import cc.md888.result.ResultCode;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 系统配置表 服务实现类
 * </p>
 *
 * @author bage
 * @since 2022-01-05
 */
@Component
public class OptionService implements MutableConfigService {

    @Autowired
    private OptionDao optionDao;

    public void createOption(CreateOptionCmd cmd) {
        Option option = new Option();
        BeanCopyUtils.copyNonNullProperties(cmd, option);
        optionDao.save(option);
    }

    public void updateOption(UpdateOptionCmd cmd) {
        Option option = optionDao.getById(cmd.getId());
        if(option == null){
            throw BizRuntimeException.from(ResultCode.ERROR, "没有找到配置："  + cmd.getId());
        }

        BeanCopyUtils.copyNonNullProperties(cmd, option);
        optionDao.updateById(option);
    }


    public void deleteOption(DeleteOptionCmd cmd) {
        Option option = optionDao.getById(cmd.getId());
        if(option == null){
            throw BizRuntimeException.from(ResultCode.ERROR, "没有找到配置："  + cmd.getId());
        }

        optionDao.removeById(option);
    }


    public IPage<OptionVO> getOptionPage(PageQuery<OptionQuery> pageQuery) {
        OptionQuery query = pageQuery.getData();
        QueryWrapper<Option> queryWrapper = Wrappers.query();
        if (!Strings.isNullOrEmpty(query.getName())) {
            queryWrapper.like(Option.NAME, query.getName());
        }
        if (!Strings.isNullOrEmpty(query.getKey())) {
            queryWrapper.like(Option.KEY, query.getKey());
        }
        if (!Strings.isNullOrEmpty(query.getValue())) {
            queryWrapper.like(Option.VALUE, query.getValue());
        }
        if (query.getId() != null) {
            queryWrapper.eq(Option.ID, query.getId());
        }
        return optionDao.page(new Page<>(pageQuery.getPageIndex(), pageQuery.getPageSize()), queryWrapper)
                .convert(OptionService::convertToOptionVO);
    }

    public OptionVO getOptionById(String id) {
        Option option = optionDao.getById(id);
        if (option == null) {
            throw BizRuntimeException.from(ResultCode.ERROR, "没有找到配置：" + id);
        }
        return convertToOptionVO(option);
    }


    public OptionVO getOptionByKey(String key) {
        Option option = optionDao.getOne(Wrappers.<Option>query().in(Option.KEY, key));
        return option != null ? convertToOptionVO(option) : null;
    }


    public String getValueByKey(String key) {
        return getValueByKey(key, null);
    }

    public String getValueByKey(String key, String defaultValue) {
        OptionVO dto = getOptionByKey(key);
        return dto != null ? dto.getValue() : defaultValue;
    }

    @Override
    public String get(String key, String defaultValue) {
        return getValueByKey(key, defaultValue);
    }




    @Override
    public void set(String key, String value) {
        Option option = optionDao.getOne(Wrappers.<Option>query().in(Option.KEY, key));
        if (option == null) {
            return;
        }
        option.setValue(value);
        optionDao.updateById(option);
    }

    public List<OptionVO> getOptionByKeys(List<String> keys) {
        List<Option> optionList = optionDao.list(Wrappers.<Option>query().in(Option.KEY, keys));
        return optionList.stream().map(OptionService::convertToOptionVO).collect(Collectors.toList());
    }

    public static OptionVO convertToOptionVO(Option option) {
        OptionVO dto = new OptionVO();
        BeanCopyUtils.copyNonNullProperties(option, dto);
        return dto;
    }

}
